package wcg;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.HashMap;

import javax.swing.JOptionPane;

//
//https://www.hakusan.co.jp/mc/dl/winchkg_ul.php
//
//　＊認証制限アリ → web2011 / nPQ4jMtS
//
//現状の仕様は、改行コードの変換はしない。また、同名ファイルは
//警告なく上書き となってます。(そのうち変えるかも)
//# version.txt を置きなおしたので改行コードはCRLFになってます。
//URLはプログラムからアクセスするので、長くてもかまいません。
//
//http://www.hakusan.co.jp/download/keisoku/update/tool/viewer/winchkg/
//は、どうでしょうか。

public class RemoteUpdate {
	public RemoteUpdate(){
	}
	/**
	 * urlリソースに書き込む（デバッグなし)
	 * @param fileurl
	 * @param mes
	 * @return
	 */
	public boolean writeUrlFile(String fileurl,String mes){
		boolean bret = false;
		URL url;
		try {
			url = new URL(fileurl);
			
			URLConnection conn = url.openConnection();
			conn.setDoOutput(true);
			OutputStream out = conn.getOutputStream();
			
			out.write(mes.getBytes());
			bret = true;
			out.flush();
			out.close();
		} catch (MalformedURLException e) {
			JOptionPane.showMessageDialog(null, "Malformed URL\n"+fileurl,"Download",JOptionPane.ERROR_MESSAGE);
			//e.printStackTrace();
		} // ダウンロードする URL
		catch (IOException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(),"Download",JOptionPane.ERROR_MESSAGE);
			//e.printStackTrace();
		}
		return bret;
	}
	/**
	 * リモートのファイルをローカルにコピーする
	 * @param fileurl
	 * @param destfile
	 * @return
	 */
	public boolean getUrlFile(String fileurl,String destfile){
		boolean bret = false;
		URL url;
		try {
			url = new URL(fileurl);
			
			URLConnection conn = url.openConnection();
			InputStream in = conn.getInputStream();
	
			File file = new File(destfile); // 保存先
			FileOutputStream out = new FileOutputStream(file, false);
			byte[] bytes = new byte[512];
			while(true){
			    int ret = in.read(bytes);
			    if(ret <= 0) break;
			    out.write(bytes, 0, ret);
			}
			bret = true;
			out.close();
			in.close();
		} catch (MalformedURLException e) {
			JOptionPane.showMessageDialog(null, "Malformed URL\n"+fileurl,"Download",JOptionPane.ERROR_MESSAGE);
			//e.printStackTrace();
		} // ダウンロードする URL
		catch (IOException e) {
			JOptionPane.showMessageDialog(null, e.getMessage(),"Download",JOptionPane.ERROR_MESSAGE);
			//e.printStackTrace();
		}
		return bret;
	}
	/**
	 * リモートのファイルを読み取る
	 * @param fileurl
	 * @return
	 */
	
	private byte[] readUrlFile(String fileurl){
		byte[] bret = null;
		URL url;
		int av=0;
		try {
			url = new URL(fileurl);
			
			URLConnection conn = url.openConnection();
			conn.connect();
			InputStream in=null;;
			in = conn.getInputStream();
			
			bret = new byte[1024];
			av = in.read(bret);
			in.close();
		
		} catch (MalformedURLException e) {
			JOptionPane.showMessageDialog(null, "Malformed URL\n"+fileurl,"Download",JOptionPane.ERROR_MESSAGE);
			//e.printStackTrace();
		} // ダウンロードする URL
		catch (IOException e) {
			JOptionPane.showMessageDialog(null, "Fail to connect\n"+fileurl,"Download",JOptionPane.ERROR_MESSAGE);
			//e.printStackTrace();
		}
		// test !  writeUrlFile(fileurl+"test","This is test");
		if(av>0){
			byte[] ret = new byte[av];
			System.arraycopy(bret,0,ret,0,av);
			return ret;
		}
		
		return null;
	}
	
	
	public HashMap<String,String[]> VersionData = new HashMap<String,String[]>();
	/**
	 * リモートのVERSIONファイル（コンマ区切り、//コメント）を読み取り、MAPに格納
	 * キーは第一番目の文字列（これをセクション名とするのが吉）
	 * @param verfile
	 * @return
	 */
	public boolean getRemoteVersion(String verfile){
		byte[] ver = readUrlFile(verfile);
		if(ver==null) return false;
		String vs  = new String(ver);
		String[] vss = vs.split("\n");
		for(int i=0;i<vss.length;i++){
			String vvv = vss[i];
			int idx = vvv.indexOf("//");
			if(idx>=0) vvv = vvv.substring(0,idx);
			if(vvv.length()<=0) continue;
			vvv = vvv.trim();
			String mes[] = vvv.split(",");
			if(mes.length<4) continue;
			for(int j=0;j<mes.length;j++){
				mes[j] = mes[j].trim();
			}
			VersionData.put(mes[0],mes);
		}
		return true;
	}
	/**
	 * 1.2.3 形式のバージョン表示をLONGの値に変換する（各桁は16進数とみなす）
	 * @param verstr
	 * @return
	 */
	public static long  convVersionStrToValue(String verstr){
		String lver[] = verstr.split("\\.");
		long ret  = 0L;
		for(int i=0;i<lver.length;i++){
			int lv = Integer.parseInt(lver[i], 16);
			ret = ret * 0x100 + lv;
		}
		return ret;
	}
}
